package com.ruoyi.system.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Objects;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.TypeEnums;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.domain.dto.ConditionReq;
import com.ruoyi.system.domain.dto.TTaskInfoDto;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.dto.TUserTaskInfoAudit;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.TTaskInfoMapper;
import com.ruoyi.system.domain.TTaskInfo;
import com.ruoyi.system.service.ITTaskInfoService;

import javax.annotation.Resource;

/**
 * 任务信息Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-04-16
 */
@Service
public class TTaskInfoServiceImpl extends ServiceImpl<TTaskInfoMapper,TTaskInfo> implements ITTaskInfoService
{
    @Resource
    private TTaskInfoMapper tTaskInfoMapper;

    /**
     * 查询任务信息
     * 
     * @param id 任务信息主键
     * @return 任务信息
     */
    @Override
    public TTaskInfo selectTTaskInfoById(Long id)
    {
        return tTaskInfoMapper.selectTTaskInfoById(id);
    }

    /**
     * 查询任务信息列表
     * 
     * @param tTaskInfo 任务信息
     * @return 任务信息
     */
    @Override
    public List<TTaskInfo> selectTTaskInfoList(TTaskInfo tTaskInfo)
    {
        return tTaskInfoMapper.selectTTaskInfoList(tTaskInfo);
    }

    /**
     * 新增任务信息
     * 
     * @param tTaskInfo 任务信息
     * @return 结果
     */
    @Override
    public int insertTTaskInfo(TTaskInfo tTaskInfo)
    {
        tTaskInfo.setCreateTime(DateUtils.getNowDate());
        return tTaskInfoMapper.insertTTaskInfo(tTaskInfo);
    }

    /**
     * 修改任务信息
     * 
     * @param tTaskInfo 任务信息
     * @return 结果
     */
    @Override
    public int updateTTaskInfo(TTaskInfo tTaskInfo)
    {
        tTaskInfo.setUpdateTime(DateUtils.getNowDate());
        return tTaskInfoMapper.updateById(tTaskInfo);
    }

    /**
     * 批量删除任务信息
     * 
     * @param ids 需要删除的任务信息主键
     * @return 结果
     */
    @Override
    public int deleteTTaskInfoByIds(Long[] ids)
    {
        return tTaskInfoMapper.deleteTTaskInfoByIds(ids);
    }

    /**
     * 删除任务信息信息
     * 
     * @param id 任务信息主键
     * @return 结果
     */
    @Override
    public int deleteTTaskInfoById(Long id)
    {
        return tTaskInfoMapper.deleteTTaskInfoById(id);
    }

    @Override
    public TTaskInfo addTaskInfo(TTaskInfo tTaskInfo) {
        tTaskInfoMapper.insert(tTaskInfo);
        return tTaskInfo;
    }

    @Override
    public List<TTaskInfoDto> selectTaskInfo(TTaskInfoDto taskInfo) {
        List<TTaskInfoDto> list = tTaskInfoMapper.selectTaskInfo(taskInfo);
        return list;
    }

    @Override
    public List<TTaskInfoDto> getHomeTaskByType(ConditionReq req) {
        List<TTaskInfoDto> list = tTaskInfoMapper.getHomeTaskByType(req);
        return list;
    }
    @Override
    public List<TTaskInfoDto> getTaskByType(ConditionReq req) {
        List<TTaskInfoDto> list = tTaskInfoMapper.getTaskByType(req);
        return list;
    }

    @Override
    public TTaskInfo checkTaskStatus(Long taskId) {
        TTaskInfo taskInfo = tTaskInfoMapper.selectById(taskId);
        if (Objects.isNull(taskInfo)){
            throw new ServiceException("任务不存在");
        }
        // 校验正式是否过期
        Date date = new Date();
        if (date.after(taskInfo.getTaskFinishTime())) {
            throw new ServiceException("任务已过期");
        }
        // 判断可接取数量大于0 才可以接取
        Integer taskNum = taskInfo.getTaskNum();// 总任务数
        Integer abjectNum = taskInfo.getAbjectNum();// 接取数量
        if (abjectNum < taskNum){
            return taskInfo;
        }
        throw new ServiceException("任务接取数量已达标");
    }

    @Override
    public List<Long> selectTaskNotId(Long taskId) {
        List<Long> longs = tTaskInfoMapper.selectTaskNotId(taskId);
        return longs;
    }

    @Override
    public void addTaskAbjectNum(TTaskInfo taskInfo) {
        Integer i = tTaskInfoMapper.addTaskAbjectNum(taskInfo.getId(),taskInfo.getVersion());
        if (i<1){
            TTaskInfo taskInfo1 = checkTaskStatus(taskInfo.getId());
            addTaskAbjectNum(taskInfo1);
        }
    }

    @Override
    public void delTaskAbjectNum(TTaskInfo taskInfo) {
        Integer i = tTaskInfoMapper.delTaskAbjectNum(taskInfo.getId(),taskInfo.getVersion());
        if (i<1){
            TTaskInfo taskInfo1 = checkTaskStatus(taskInfo.getId());
            delTaskAbjectNum(taskInfo1);
        }
    }

    /**
     * 查询用户提交接去任务
     * @param taskInfo
     * @return
     */
    @Override
    public List<TUserTaskInfoAudit> getUserTask(TTaskInfoDto taskInfo) {
        List<TUserTaskInfoAudit> res = tTaskInfoMapper.selectUserTask(taskInfo);
        return res;
    }

    @Override
    public void addFinishOne(TTaskInfo t) {
        Integer version = t.getVersion();
        Long id = t.getId();
        Integer i = tTaskInfoMapper.addFinishOne(id,version);
        if (i<1) {
            TTaskInfo taskInfo = tTaskInfoMapper.selectById(id);
            addFinishOne(taskInfo);
        }
    }
}
